/**
 * Created by machan on 2017/6/7.
 */
import * as constants from '../common/Constants';
const cryptManager = require('./cryptManager');
import CaHelper from './CaHelper';
import CryptoUtils from '../utils/cryption/CryptoUtils';
import StringUtils from '../utils/StringUtils';
import UmfLog from '../utils/UmfLog';

function safeResult() {
    this.retCode='';// 返回码（明文）
    this.retMsg='';// 返回信息（明文）
    this.randomNum='';// 签名随机串（以aes密钥加密）
    this.sign='';// 签名（以aes密钥加密）
    this.sessionId = "";// 安全层使用的sessionId（以aes密钥加密）
    this.body='';// 业务层返回，转换成json串/通信密钥过期时返回最新通信密钥证书流（以aes密钥加密）
    this.certId='';// 证书id（以aes密钥加密）

    /**
     * 初始化
     * @param retCode
     * @param retMsg
     * @param randomNum
     * @param randomNumEncode
     * @param sign
     * @param sessionId
     * @param body
     * @param bodyEncode
     * @param certId
     */
    this.init = (retCode, retMsg, randomNum, sign, sessionId, body,  certId)=> {
        this.retCode= retCode;
        this.retMsg= retMsg;
        this.randomNum= randomNum;
        this.sign = sign;
        this.sessionId = sessionId;
        this.body = body;
        this.certId = certId;
    };

    /**
     * 请求是否成功
     * @returns {boolean}
     */
    this.isSuccess = ()=> {
        return this.retCode === constants.RetCodes.SUCCESS;
    };

    this.parse = (str)=>{
        return  StringUtils.hexToString(str);
    };

    /**
     * 将返回的数据解密为明文
     * @param aesKey
     */
    this.parseData = (aesKey)=> {
        this.retCode = this.parse(this.retCode);
        this.retMsg = this.parse(this.retMsg);
        try {
            if (!(this.retCode === constants.RetCodes.RETCODE_TXCANEEDUPDATE)) {
                // 更新证书时 body未加密
                this.body = cryptManager.decryptBody(aesKey, this.parse(this.body));
            }

            if(this.randomNum){
                this.randomNum = cryptManager.decryptBody(aesKey, this.parse(this.randomNum));
            }

            if(this.sign){
                this.sign = cryptManager.decryptBody(aesKey, this.parse(this.sign));
            }

            return true;
        } catch (e) {
            UmfLog.error(e);
        }
        return false;
    }
}

export function decodeProcessResult(result, safeSdk) {
    let rsafeResult = Object.assign(new safeResult(), result);
    if (!rsafeResult.parseData(safeSdk.aesKey)) {// 数据解密失败
        UmfLog.error("数据解密失败");
        return null;
    }
    if (rsafeResult.isSuccess()) {
        if (checkDataSign(rsafeResult)) {//验证签名
            return rsafeResult;
        }
        return null;
    } else if (constants.RetCodes.RETCODE_TXCANEEDUPDATE === rsafeResult.retCode) {
        //更新证书
        CaHelper.updateCa(rsafeResult, true);
        return null;
    }
}

/**
 * desc:对返回数据进行签名验证
 * <p>
 * 创建人：xuyang , 2015年8月25日 下午4:39:32
 * </p>
 *
 * @param safeResult
 * @return boolean
 */
function checkDataSign(safeResult) {
    let msg = safeResult.body + safeResult.randomNum;
    let sha1Digest = CryptoUtils.sha1Encrypt(msg);
    return sha1Digest == safeResult.sign
}

